﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using Liquidaciones.Models;
using System.IO;
using Liquidaciones.Repositories;

namespace Liquidaciones.Controllers
{
    public class AccountController : Controller
    {

        // POST: /Account/LogOn

        //[HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            //if (ModelState.IsValid)
            {
                if (Membership.ValidateUser(model.UserName, model.Password))
                {
                    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {

                        if (Roles.IsUserInRole(model.UserName, "Administrador"))
                        {
                            return RedirectToAction("Index", "Administrador", new { id = User.Identity, username = model.UserName.ToString() });
                        }
                        else if (Roles.IsUserInRole(model.UserName, "Liquidador"))
                        {
                            return RedirectToAction("Index", "Liquidador", new { id = User.Identity, username = model.UserName.ToString() });
                        }
                        else if (Roles.IsUserInRole(model.UserName, "Empleado"))
                        {
                            return RedirectToAction("Index", "Empleado", new { id = User.Identity, username = model.UserName.ToString() });
                        }
                    }
                }
                else
                {
                    ModelState.AddModelError("", "La combinacion de nombre de ususario y contraseña son incorrectos.");
                }
            }
            // If we got this far, something failed, redisplay form
            return View();
        }

        //
        // GET: /Account/LogOff

        public ActionResult LogOff()
        {
            FormsAuthentication.SignOut();

            return RedirectToAction("Index", "Home");
        }

        //
        // GET: /Account/Register

        public ActionResult RegisterEmpleado()
        {
            return View();
        }

        //
        // POST: /Account/Register

        [HttpPost]
        public ActionResult RegisterEmpleado(RegisterModel model)
        {
            EmpleadoRepository empleadoRepository = new EmpleadoRepository();
            if (ModelState.IsValid)
            {
                // Attempt to register the user
                MembershipCreateStatus createStatus;
                MembershipUser usuario = Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);

                if (createStatus == MembershipCreateStatus.Success) //Si el usuario se creo con exito, prosigo a crear el empleado y cargarlo a la base de datos.
                {
                    Guid idEmpleado = (Guid)usuario.ProviderUserKey;    //Tomo la clave generada para el usuario y se la asigno al empleado.

                    //Tomo todos los datos del formulario.
                    String nombre = Request["nombre"];
                    String apellido = Request["apellido"];
                    String dni = Request["dni"];
                    String email = Request["email"];
                    long cuenta = long.Parse(Request["cuenta"]);
                    String categoria = Request["categoria"];
                    DateTime nacimiento = DateTime.Parse(Request["nacimiento"]);
                    HttpPostedFileBase image = Request.Files[0];    //Hago un request del archivo que se cargo y lo guardo como HttpPostedFileBase.

                    if (image.ContentType == "image/jpeg" && image.ContentLength < (2000*1000))
                    {
                        byte[] foto; //Creo una variable foto como arreglo de bytes.
                        using (var ms = new MemoryStream()) //utilizo una variable ms de tipo Memory Stream para guardar el stream del archivo guardado.
                        {
                            image.InputStream.CopyTo(ms);   //Copio el InputStream del archivo de imagen al MemoryStream.
                            foto = ms.ToArray();            //Paso el MemoryStream a un arreglo de bytes y lo guardo en la variable foto.               
                        }

                        Empleado empleado = new Empleado(idEmpleado, nombre, apellido, dni, email, cuenta, nacimiento, categoria, foto);    //Creo un nevo empleado que recibe todos los input y la foto convertida byte[].
                        empleadoRepository.Create(empleado);                //cargo el empleado a la base de datos.                    
                        Roles.AddUserToRole(model.UserName, "Empleado");    //Asigno el rol.
                        return RedirectToAction("Ver", "Empleado", new { id = empleado.IdEmpleado });   //Redirecciono a la vista del empleado recien creado.
                    }
                    else
                    {
                        Membership.DeleteUser(model.UserName);
                        if (image.ContentType != "image/jpeg")
                        {
                            ModelState.AddModelError("", "El archivo ingresado en el campo 'Foto' no es una imagen en el formato correcto. Por favor ingrese una imagen en formato jpeg/jpg");
                        }

                        else
                        {
                            ModelState.AddModelError("", "El tamaño de la imágen excede los 2MB. Por favor ingrese una imágen que no exceda ese tamaño.");
                        }
                    }
                }
                else
                {
                    ModelState.AddModelError("", ErrorCodeToString(createStatus));
                }
            }

            // If we got this far, something failed, redisplay form
            return View();
        }


        public ActionResult RegisterLiquidador()
        {
            return View();
        }

        [HttpPost]
        public ActionResult RegisterLiquidador(RegisterModel model)
        {
            LiquidadorRepository liquidadorRepository = new LiquidadorRepository();
            if (ModelState.IsValid)
            {
                // Attempt to register the user
                MembershipCreateStatus createStatus;
                MembershipUser usuario = Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);
                   

                if (createStatus == MembershipCreateStatus.Success)
                {
                    Guid idLiquidador = (Guid)usuario.ProviderUserKey;
                    String nombre = Request["nombre"];
                    String apellido = Request["apellido"];

                    Liquidador liquidador = new Liquidador(idLiquidador, nombre, apellido);
                    liquidadorRepository.Crear(liquidador);
                    Roles.AddUserToRole(model.UserName, "Liquidador");
                    //FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
                    return RedirectToAction("Ver", "Liquidador", new { id = liquidador.IdLiquidador });
                }
                else
                {
                    ModelState.AddModelError("", ErrorCodeToString(createStatus));
                }
            }

        return View();
        }


        //
        // GET: /Account/ChangePassword

        [Authorize]
        public ActionResult ChangePassword()
        {
            return View();
        }

        //
        // POST: /Account/ChangePassword

        [Authorize]
        [HttpPost]
        public ActionResult ChangePassword(ChangePasswordModel model)
        {
            if (ModelState.IsValid)
            {

                // ChangePassword will throw an exception rather
                // than return false in certain failure scenarios.
                bool changePasswordSucceeded;
                try
                {
                    MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
                    changePasswordSucceeded = currentUser.ChangePassword(model.OldPassword, model.NewPassword);
                }
                catch (Exception)
                {
                    changePasswordSucceeded = false;
                }

                if (changePasswordSucceeded)
                {
                    return RedirectToAction("ChangePasswordSuccess");
                }
                else
                {
                    ModelState.AddModelError("", "La contraseña actual es incorrecta o la nueva contraseña es invalida.");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

        //
        // GET: /Account/ChangePasswordSuccess

        public ActionResult ChangePasswordSuccess()
        {
            return View();
        }

        #region Status Codes
        private static string ErrorCodeToString(MembershipCreateStatus createStatus)
        {
            // See http://go.microsoft.com/fwlink/?LinkID=177550 for
            // a full list of status codes.
            switch (createStatus)
            {
                case MembershipCreateStatus.DuplicateUserName:
                    return "Ya existe el nombre de usuario. Por favor ingrese uno distinto";

                case MembershipCreateStatus.DuplicateEmail:
                    return "Ya existe una cuenta asociada a ese email. Por favor ingrese un email distinto.";

                case MembershipCreateStatus.InvalidPassword:
                    return "La contraseña ingresada es inválida. Por favor ingrese una contraseña válida";

                case MembershipCreateStatus.InvalidEmail:
                    return "La direccion de e-mail suministrada es invalida. Por favor verificar el valor e intentarlo de nuevo..";

                case MembershipCreateStatus.InvalidAnswer:
                    return "La respuesta para la recuperacion de la contraseña es invalida. Por favor verificar el valor e intentarlo de nuevo.";

                case MembershipCreateStatus.InvalidQuestion:
                    return "La pregunta para la recuperacion de la contraseña es invalida. Por favor verificar el valor e intentarlo de nuevo.";

                case MembershipCreateStatus.InvalidUserName:
                    return "El nombre de usuario ingresado es invalido. Por favor verificar el valor e intentarlo de nuevo.";

                case MembershipCreateStatus.ProviderError:
                    return "La autenticacion ingresada arrojo un error. Por favor verificar el ingreso e intentar de nuevo. Si el problema persiste,por favor contacta al administrador..";

                case MembershipCreateStatus.UserRejected:
                    return "El pedido de creacion de usuario fue cancelado. Por favor verificar el ingreso e intentar de nuevo. Si el problema persiste,por favor contacta al administrador.";

                default:
                    return "Un error desconocido ha ocurrido. Por favor verificar el ingreso e intentar de nuevo. Si el problema persiste,por favor contacta al administrador.";
            }
        }
        #endregion
    }
}




 

        
